<?php

declare (strict_types=1);
/**
 * @copyright 深圳市易果网络科技有限公司
 * @version 1.0.0
 * @link https://dayiguo.com
 */

namespace App\Service\User;


use App\Dao\CouponPaymentDao;
use App\Dao\PaymentDao;
use App\Exception\CustomException;
use App\Service\Service;

use Hyperf\AsyncQueue\Driver\DriverFactory;
use Hyperf\DbConnection\Db;
use Hyperf\Di\Annotation\Inject;
use Hyperf\Snowflake\IdGeneratorInterface;
use Pingpp\Pingpp;

/**
 * Ping++支付服务
 *
 * @author 张昊(2396675557@qq.com)
 * @package App\Service\User
 */
class PingPpService extends Service
{

    /**
     * KEY
     *
     * @var string
     */
    private $ApiKey = "sk_live_nffDG8DCa1OCyf5G8KLyjTu1";

    /**
     * APPID
     *
     * @var string
     */
    private $app_id = "app_TenHG4OWbrTO4Gen";


    /**
     * 优惠券支付记录
     *
     * @Inject
     * @var CouponPaymentDao
     */
    private $coupon_payment_dao;

    /**
     * 支付记录 DAO
     *
     * @Inject()
     * @var PaymentDao
     */
    private $dao;



    public function __construct()
    {
        Pingpp::setApiKey($this->ApiKey);

        Pingpp::setPrivateKeyPath('/home/wwwroot/default/tuxianghui/rsa_private_key.pem');
    }

    /**
     * APP支付 - 积分商城支付
     * @param array $params
     * @param string $channel
     * @param string $body
     * @param string $title
     * @return \Pingpp\Charge
     */
    public function unpaidPay(array $params, string $channel, string $title, string $body = '')
    {
        try {

            $result = \Pingpp\Charge::create(
                [
                    // 请求参数字段规则，请参考 API 文档：https://www.pingxx.com/api#api-c-new
                    'subject'   => $title,
                    'body'      => $body,
                    'amount'    => $params['amount'] * 100,                 // 订单总金额, 人民币单位：分（如订单总金额为 1 元，此处请填 100）
                    'order_no'  => 'order'.$params['pay_no'],                // 推荐使用 8-20 位，要求数字或字母，不允许其他字符
                    'currency'  => 'cny',
                    //'extra'     => $extra,
                    'channel'   => $channel,                // 支付使用的第三方支付渠道取值，请参考：https://www.pingxx.com/api#api-c-new
                    'client_ip' => '127.0.0.1', // 发起支付请求客户端的 IP 地址，格式为 IPV4，如: 127.0.0.1
                    'app'       => ['id' => $this->app_id],
                ]
            );
            return $result;                                       // 输出 Ping++ 返回的支付凭据 Charge
        } catch (\Pingpp\Error\Base $e) {
            // 捕获报错信息
            if ($e->getHttpStatus() != null) {
                var_dump($e->getHttpBody());
            } else {
                var_dump($e->getMessage());
            }
        }
    }

    /**
     * APP支付 - 积分商城支付
     * @param array $params
     * @param string $channel
     * @param string $body
     * @param string $title
     * @return \Pingpp\Charge
     */
    public function pay(array $params, string $channel, string $title, string $body = '')
    {
        try {
            unset($params['title']);
            $pay_no = (string)$this->container->get(IdGeneratorInterface::class)->generate();
            $this->dao->firstOrCreate($params, [
                'pay_no' => $pay_no,
                'channel' => $channel
            ]);

            $result = \Pingpp\Charge::create(
                [
                    // 请求参数字段规则，请参考 API 文档：https://www.pingxx.com/api#api-c-new
                    'subject'   => $title,
                    'body'      => $body,
                    'amount'    => $params['amount'] * 100,                 // 订单总金额, 人民币单位：分（如订单总金额为 1 元，此处请填 100）
                    'order_no'  => 'order'.$pay_no,                // 推荐使用 8-20 位，要求数字或字母，不允许其他字符
                    'currency'  => 'cny',
                    //'extra'     => $extra,
                    'channel'   => $channel,                // 支付使用的第三方支付渠道取值，请参考：https://www.pingxx.com/api#api-c-new
                    'client_ip' => '127.0.0.1', // 发起支付请求客户端的 IP 地址，格式为 IPV4，如: 127.0.0.1
                    'app'       => ['id' => $this->app_id],
                ]
            );
            return $result;                                       // 输出 Ping++ 返回的支付凭据 Charge
        } catch (\Pingpp\Error\Base $e) {
            // 捕获报错信息
            if ($e->getHttpStatus() != null) {
                var_dump($e->getHttpBody());
            } else {
                var_dump($e->getMessage());
            }
        }
    }

    /**
     * APP支付 - 优惠券支付
     * @param array $params
     * @param string $channel
     * @param string $body
     * @param string $title
     * @return \Pingpp\Charge
     */
    public function coupon_pay(array $params, string $channel, string $title, string $body = '')
    {
        try {
            unset($params['title']);
            $pay_no = (string)$this->container->get(IdGeneratorInterface::class)->generate();

            $this->coupon_payment_dao->firstOrCreate($params, [
                'pay_no' => $pay_no,
                'channel' => $channel
            ]);

            $result = \Pingpp\Charge::create(
                [
                    // 请求参数字段规则，请参考 API 文档：https://www.pingxx.com/api#api-c-new
                    'subject'   => $title,
                    'body'      => $body,
                    'amount'    => $params['amount'] * 100,                 // 订单总金额, 人民币单位：分（如订单总金额为 1 元，此处请填 100）
                    'order_no'  => 'coupon'.$pay_no,                // 推荐使用 8-20 位，要求数字或字母，不允许其他字符
                    'currency'  => 'cny',
                    //'extra'     => $extra,
                    'channel'   => $channel,                // 支付使用的第三方支付渠道取值，请参考：https://www.pingxx.com/api#api-c-new
                    'client_ip' => '127.0.0.1', // 发起支付请求客户端的 IP 地址，格式为 IPV4，如: 127.0.0.1
                    'app'       => ['id' => $this->app_id],
                ]
            );
            return $result;                                       // 输出 Ping++ 返回的支付凭据 Charge
        } catch (\Pingpp\Error\Base $e) {
            // 捕获报错信息
            if ($e->getHttpStatus() != null) {
                var_dump($e->getHttpBody());
            } else {
                var_dump($e->getMessage());
            }
        }
    }


    /**
     * APP支付 - 渠道商购买
     * @param array $params
     * @param string $channel
     * @param string $body
     * @param string $title
     * @return \Pingpp\Charge
     */
    public function channel_pay(array $params, string $channel, string $title, string $body = '')
    {
        try {
            //$pay_no = (string)$this->container->get(IdGeneratorInterface::class)->generate();

            $result = \Pingpp\Charge::create(
                [
                    // 请求参数字段规则，请参考 API 文档：https://www.pingxx.com/api#api-c-new
                    'subject'   => $title,
                    'body'      => $body,
                    'amount'    => $params['amount'] * 100,                 // 订单总金额, 人民币单位：分（如订单总金额为 1 元，此处请填 100）
                    'order_no'  => 'channel'.$params['order_no'],                // 推荐使用 8-20 位，要求数字或字母，不允许其他字符
                    'currency'  => 'cny',
                    //'extra'     => $extra,
                    'channel'   => $channel,                // 支付使用的第三方支付渠道取值，请参考：https://www.pingxx.com/api#api-c-new
                    'client_ip' => '127.0.0.1', // 发起支付请求客户端的 IP 地址，格式为 IPV4，如: 127.0.0.1
                    'app'       => ['id' => $this->app_id],
                ]
            );
            return $result;                                       // 输出 Ping++ 返回的支付凭据 Charge
        } catch (\Pingpp\Error\Base $e) {
            // 捕获报错信息
            if ($e->getHttpStatus() != null) {
                var_dump($e->getHttpBody());
            } else {
                var_dump($e->getMessage());
            }
        }
    }


    /**
     * @param array $params
     * @param string $channel
     * @param string $title
     * @param string $body
     * array $extra
     * @return \Pingpp\Charge
     */
    public function scan_pay(array $params, string $channel, string $title, string $body, array $extra)
    {
        try {
            if( $channel == 'wx' || $channel == 'alipay' ) {
                $result = \Pingpp\Charge::create(
                    [
                        // 请求参数字段规则，请参考 API 文档：https://www.pingxx.com/api#api-c-new
                        'subject'   => $title,
                        'body'      => $body,
                        'amount'    => $params['amount'] * 100,                 // 订单总金额, 人民币单位：分（如订单总金额为 1 元，此处请填 100）
                        'order_no'  => 'scan'.$params['order_no'],                // 推荐使用 8-20 位，要求数字或字母，不允许其他字符
                        'currency'  => 'cny',
                        //'extra'     => $extra,
                        'channel'   => $channel,                // 支付使用的第三方支付渠道取值，请参考：https://www.pingxx.com/api#api-c-new
                        'client_ip' => '127.0.0.1', // 发起支付请求客户端的 IP 地址，格式为 IPV4，如: 127.0.0.1
                        'app'       => ['id' => $this->app_id],
                    ]
                );
            } else if($channel == 'wx_pub'){
                $result = \Pingpp\Charge::create(
                    [
                        // 请求参数字段规则，请参考 API 文档：https://www.pingxx.com/api#api-c-new
                        'subject'   => $title,
                        'body'      => $body,
                        'amount'    => $params['amount'] * 100,                 // 订单总金额, 人民币单位：分（如订单总金额为 1 元，此处请填 100）
                        'order_no'  => 'scan'.$params['order_no'],                // 推荐使用 8-20 位，要求数字或字母，不允许其他字符
                        'currency'  => 'cny',
                        //'open_id' => $openid,
                        'extra'     => $extra,
                        'channel'   => $channel,                // 支付使用的第三方支付渠道取值，请参考：https://www.pingxx.com/api#api-c-new
                        'client_ip' => '127.0.0.1', // 发起支付请求客户端的 IP 地址，格式为 IPV4，如: 127.0.0.1
                        'app'       => ['id' => $this->app_id],
                    ]
                );
            }

            return $result;                                       // 输出 Ping++ 返回的支付凭据 Charge
        } catch (\Pingpp\Error\Base $e) {
            // 捕获报错信息
            if ($e->getHttpStatus() != null) {
                var_dump($e->getHttpBody());
            } else {
                var_dump($e->getMessage());
            }
        }
    }

}